package agenti;

import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.ParallelBehaviour;

import componenti.Buffer;
import componenti.Entity;
import componenti.GeneratoreCasuale;
import componenti.LeggeDistribuzione;
import componenti.SimulationModel;

@SuppressWarnings("serial")
public class AgenteGeneratore extends Agent {

	private SimulationModel sm;
	private int elementiTotali;
	private Buffer buffer;
	private double[] realizzazioniMonteCarlo;

	@Override
	protected void setup() {
		super.setup();
		Object[] parametri = getArguments();
		sm = (SimulationModel) parametri[0];
		elementiTotali = (Integer) parametri[2];
		buffer = (Buffer) parametri[3];
		realizzazioniMonteCarlo = GeneratoreCasuale.getSimulation(
				(LeggeDistribuzione) parametri[1], elementiTotali);
		ParallelBehaviour p = new ParallelBehaviour(this,
				ParallelBehaviour.WHEN_ALL);
		p.addSubBehaviour(new RiempiBuffer());
		p.addSubBehaviour(new NotificaModello());
		p.addSubBehaviour(new NotificaAgenteMonitor());
		addBehaviour(p);
	}

	private class RiempiBuffer extends Behaviour {

		private int elementoCorrente = 1;

		@Override
		public void action() {
			Entity o = new Entity();
			o.setTempoInterarrivo(realizzazioniMonteCarlo[elementoCorrente]);
			buffer.aggiungi(o);
			// TODO Mandare Messaggio al consumatore???
			elementoCorrente++;
		}

		@Override
		public boolean done() {
			return elementoCorrente == elementiTotali;
		}
	}

	private class NotificaModello extends Behaviour {

		private int elementoCorrente = 1;

		@Override
		public void action() {
			// TODO Notifica modello.
			elementoCorrente++;
		}

		@Override
		public boolean done() {
			return elementoCorrente == elementiTotali;
		}

	}
}
